﻿Imports LullabyFullDeCaixa.Web
Imports System.ServiceModel.DomainServices.Client
Imports LullabyFullDeCaixa.My.Resources

Public Class Contexte
    Private Shared _DomainContext As LullabyDomainContext
    Private Shared _UsuariActual As Usuari
    Private Shared _EstatCarregaActual As Integer = 0

    Public Shared Event AutomaticLoadStep(ByVal ItemCounter As Integer)
    Public Shared Event ContexteInicialitzat(ByVal Resultat As Boolean, ByVal Missatge As String)

    Public Const MAX_ITEM_LOAD_STEP As Integer = 4

#Region "LLista Hostals"
    Public Shared Event HostalsCarregats(ByVal Resultat As Boolean, ByVal Missatge As String)

    Private Shared _IsHostalsLoaded As Boolean = False
    Private Shared _IsHostalsLoading As Boolean = False
    Public Shared ReadOnly Property IsHostalsLoaded() As Boolean
        Get
            Return _IsHostalsLoaded
        End Get
    End Property

    Public Shared ReadOnly Property Hostals() As List(Of Hostal)
        Get
            Return New List(Of Hostal)((From C As Hostal In DomainContext.Hostals))
        End Get
    End Property

    Public Shared ReadOnly Property HostalsPerUsuariActual As List(Of Hostal)
        Get
            If Contexte.UsuariActual.IdTipusUsuari = EnumTipusUsuari.Administrador Then
                Return Hostals
            Else
                Dim Resultat As List(Of Hostal) = (From UH As UsuariHostal In Contexte.UsuariActual.UsuariHostals Where UH.Hostal.Ip = App.IpAddress Select UH.Hostal).ToList

                If Resultat.Count = 0 Then
                    Resultat = (From UH As UsuariHostal In Contexte.UsuariActual.UsuariHostals Select UH.Hostal).ToList
                End If

                Return Resultat
            End If
        End Get
    End Property

    Public Shared Sub UnloadHostals()
        DomainContext.Hostals.Clear()
        _IsHostalsLoaded = False
    End Sub

    Public Shared Sub LoadHostals()
        'El primer cop carreguem de la BD, la resta ja ho tenim
        Try
            If Not IsContexteInicialitzat Then
                RaiseEvent HostalsCarregats(False, StringLibrary.ContextNotInicialitzat)
                Return
            End If

            If Not IsHostalsLoaded Then
                If Not _IsHostalsLoading Then
                    _IsHostalsLoading = True
                    LullabyFullDeCaixa.Contexte.DomainContext.Load(LullabyFullDeCaixa.Contexte.DomainContext.GetHostalsQuery(), _
                       New Action(Of LoadOperation(Of LullabyFullDeCaixa.Web.Hostal))(AddressOf HostalsLoaded), _
                       Nothing)
                End If
            Else
                RaiseEvent HostalsCarregats(True, "")
            End If
        Catch ex As Exception
            RaiseEvent HostalsCarregats(False, ex.Message)
        End Try
    End Sub

    Private Shared Sub HostalsLoaded(ByVal LListaHostals As LoadOperation(Of LullabyFullDeCaixa.Web.Hostal))
        'Un cop carregat ho guardem en una llista
        _IsHostalsLoading = False

        If Not IsContexteInicialitzat Then
            RaiseEvent HostalsCarregats(False, StringLibrary.ContextNotInicialitzat)
            Return
        End If

        If LListaHostals.HasError Then
            RaiseEvent HostalsCarregats(False, LListaHostals.Error.Message)
        Else
            _IsHostalsLoaded = True
            RaiseEvent HostalsCarregats(True, "")
        End If
        LoadNext()
    End Sub
#End Region

#Region "LLista TipusDespesaIngres"
    Public Shared Event TipusDespesaIngresCarregats(ByVal Resultat As Boolean, ByVal Missatge As String)

    Private Shared _IsTipusDespesaIngresLoaded As Boolean = False
    Private Shared _IsTipusDespesaIngresLoading As Boolean = False
    Public Shared ReadOnly Property IsTipusDespesaIngresLoaded() As Boolean
        Get
            Return _IsTipusDespesaIngresLoaded
        End Get
    End Property

    Public Shared ReadOnly Property TipusDespesaIngres() As List(Of TipusDespesaIngres)
        Get
            Return New List(Of TipusDespesaIngres)((From C As TipusDespesaIngres In DomainContext.TipusDespesaIngres))
        End Get
    End Property

    Public Shared Sub UnloadTipusDespesaIngres()
        DomainContext.TipusDespesaIngres.Clear()
        _IsTipusDespesaIngresLoaded = False
    End Sub

    Public Shared Sub LoadTipusDespesaIngres()
        'El primer cop carreguem de la BD, la resta ja ho tenim
        Try
            If Not IsContexteInicialitzat Then
                RaiseEvent TipusDespesaIngresCarregats(False, StringLibrary.ContextNotInicialitzat)
                Return
            End If

            If Not IsTipusDespesaIngresLoaded Then
                If Not _IsTipusDespesaIngresLoading Then
                    _IsTipusDespesaIngresLoading = True
                    LullabyFullDeCaixa.Contexte.DomainContext.Load(LullabyFullDeCaixa.Contexte.DomainContext.GetTipusDespesaIngresQuery(), _
                       New Action(Of LoadOperation(Of LullabyFullDeCaixa.Web.TipusDespesaIngres))(AddressOf TipusDespesaIngresLoaded), _
                       Nothing)
                End If
            Else
                RaiseEvent TipusDespesaIngresCarregats(True, "")
            End If
        Catch ex As Exception
            RaiseEvent TipusDespesaIngresCarregats(False, ex.Message)
        End Try
    End Sub

    Private Shared Sub TipusDespesaIngresLoaded(ByVal LListaTipusDespesaIngres As LoadOperation(Of LullabyFullDeCaixa.Web.TipusDespesaIngres))
        'Un cop carregat ho guardem en una llista
        _IsTipusDespesaIngresLoading = False

        If Not IsContexteInicialitzat Then
            RaiseEvent TipusDespesaIngresCarregats(False, StringLibrary.ContextNotInicialitzat)
            Return
        End If

        If LListaTipusDespesaIngres.HasError Then
            RaiseEvent TipusDespesaIngresCarregats(False, LListaTipusDespesaIngres.Error.Message)
        Else
            _IsTipusDespesaIngresLoaded = True
            RaiseEvent TipusDespesaIngresCarregats(True, "")
        End If
        LoadNext()
    End Sub
#End Region

#Region "LLista Urgències"
    Private Shared _Urgencies As List(Of Urgencia)
    Public Shared ReadOnly Property Urgencies() As List(Of Urgencia)
        Get
            If _Urgencies Is Nothing Then
                _Urgencies = New List(Of Urgencia)
                _Urgencies.Add(New Urgencia(EnumUrgencia.MoltUrgent))
                _Urgencies.Add(New Urgencia(EnumUrgencia.Urgent))
                _Urgencies.Add(New Urgencia(EnumUrgencia.Normal))
            End If

            Return _Urgencies.ToList()

        End Get
    End Property
#End Region

#Region "LLista Categories"
    Public Shared Event CategoriesCarregades(ByVal Resultat As Boolean, ByVal Missatge As String)

    Private Shared _IsCategoriesLoaded As Boolean = False
    Private Shared _IsCategoriesLoading As Boolean = False
    Public Shared ReadOnly Property IsCategoriesLoaded() As Boolean
        Get
            Return _IsCategoriesLoaded
        End Get
    End Property

    Public Shared ReadOnly Property Categories() As List(Of ThingsToDoCategory)
        Get
            Return New List(Of ThingsToDoCategory)((From C As ThingsToDoCategory In DomainContext.ThingsToDoCategories))
        End Get
    End Property

    Public Shared Sub UnloadCategories()
        DomainContext.ThingsToDoCategories.Clear()
        _IsCategoriesLoaded = False
    End Sub

    Public Shared Sub LoadCategories()
        'El primer cop carreguem de la BD, la resta ja ho tenim
        Try
            If Not IsContexteInicialitzat Then
                RaiseEvent CategoriesCarregades(False, StringLibrary.ContextNotInicialitzat)
                Return
            End If

            If Not IsCategoriesLoaded Then
                If Not _IsCategoriesLoading Then
                    _IsCategoriesLoading = True
                    LullabyFullDeCaixa.Contexte.DomainContext.Load(LullabyFullDeCaixa.Contexte.DomainContext.GetThingsToDoCategoriesQuery(), _
                       New Action(Of LoadOperation(Of LullabyFullDeCaixa.Web.ThingsToDoCategory))(AddressOf CategoriesLoaded), _
                       Nothing)
                End If
            Else
                RaiseEvent CategoriesCarregades(True, "")
            End If
        Catch ex As Exception
            RaiseEvent CategoriesCarregades(False, ex.Message)
        End Try
    End Sub

    Private Shared Sub CategoriesLoaded(ByVal LListaCategories As LoadOperation(Of LullabyFullDeCaixa.Web.ThingsToDoCategory))
        'Un cop carregat ho guardem en una llista
        _IsCategoriesLoading = False

        If Not IsContexteInicialitzat Then
            RaiseEvent CategoriesCarregades(False, StringLibrary.ContextNotInicialitzat)
            Return
        End If

        If LListaCategories.HasError Then
            RaiseEvent CategoriesCarregades(False, LListaCategories.Error.Message)
        Else
            _IsCategoriesLoaded = True
            RaiseEvent CategoriesCarregades(True, "")
        End If
        LoadNext()
    End Sub
#End Region

#Region "LLista Usuaris"
    Public Shared Event UsuarisCarregats(ByVal Resultat As Boolean, ByVal Missatge As String)

    Private Shared _IsUsuarisLoaded As Boolean = False
    Private Shared _IsUsuarisLoading As Boolean = False
    Public Shared ReadOnly Property IsUsuarisLoaded() As Boolean
        Get
            Return _IsUsuarisLoaded
        End Get
    End Property

    Public Shared ReadOnly Property Usuaris() As List(Of Usuari)
        Get
            Return New List(Of Usuari)((From C As Usuari In DomainContext.Usuaris))
        End Get
    End Property

    Public Shared Sub UnloadUsuaris()
        DomainContext.Usuaris.Clear()
        _IsUsuarisLoaded = False
    End Sub

    Public Shared Sub LoadUsuaris()
        'El primer cop carreguem de la BD, la resta ja ho tenim
        Try
            If Not IsContexteInicialitzat Then
                RaiseEvent UsuarisCarregats(False, StringLibrary.ContextNotInicialitzat)
                Return
            End If

            If Not IsUsuarisLoaded Then
                If Not _IsUsuarisLoading Then
                    _IsUsuarisLoading = True
                    LullabyFullDeCaixa.Contexte.DomainContext.Load(LullabyFullDeCaixa.Contexte.DomainContext.GetUsuarisQuery(), _
                       New Action(Of LoadOperation(Of LullabyFullDeCaixa.Web.Usuari))(AddressOf UsuarisLoaded), _
                       Nothing)
                End If
            Else
                RaiseEvent UsuarisCarregats(True, "")
            End If
        Catch ex As Exception
            RaiseEvent UsuarisCarregats(False, ex.Message)
        End Try
    End Sub

    Private Shared Sub UsuarisLoaded(ByVal LListaUsuaris As LoadOperation(Of LullabyFullDeCaixa.Web.Usuari))
        'Un cop carregat ho guardem en una llista
        _IsUsuarisLoading = False

        If Not IsContexteInicialitzat Then
            RaiseEvent UsuarisCarregats(False, StringLibrary.ContextNotInicialitzat)
            Return
        End If

        If LListaUsuaris.HasError Then
            RaiseEvent UsuarisCarregats(False, LListaUsuaris.Error.Message)
        Else
            _IsUsuarisLoaded = True
            RaiseEvent UsuarisCarregats(True, "")
        End If
        LoadNext()
    End Sub
#End Region

#Region "Carrega automàtica de dades"
    Private Shared Sub LoadNext()

        If UsuariActual Is Nothing Then Return

        Select Case _EstatCarregaActual
            Case 0
                System.Diagnostics.Debug.WriteLine("Carreguem els Hostals")
                LoadHostals()
            Case 1
                System.Diagnostics.Debug.WriteLine("Carreguem els Tipus despesa Ingres")
                LoadTipusDespesaIngres()
            Case 2
                System.Diagnostics.Debug.WriteLine("Carreguem els Usuaris")
                LoadUsuaris()
            Case 3
                System.Diagnostics.Debug.WriteLine("Carreguem les categories Things To Do")
                LoadCategories()
                'Case 3
                '    _EstatCarregaActual = MAX_ITEM_REFRESH_STEP


                'A partir d'aquí son els refrescos
                'Case MIN_ITEM_REFRESH_STEP
                '    System.Diagnostics.Debug.WriteLine("Refresquem els NodesArbre")
                '    LoadNodesArbre(True)
                'Case MAX_ITEM_REFRESH_STEP
                '    System.Diagnostics.Debug.WriteLine("Refresquem les línies hidràuliques")
                '    LoadLiniesHidrauliques(True)

        End Select

        _EstatCarregaActual = _EstatCarregaActual + 1

        RaiseEvent AutomaticLoadStep(_EstatCarregaActual)
    End Sub
#End Region

#Region "Crear i Destruir"
    Public Shared Sub Init(ByVal pUser As String, ByVal pPassword As String)
        _EstatCarregaActual = 0
        DomainContext.Load(DomainContext.GetUsuariByNamePasswordQuery(pUser, pPassword), _
           New Action(Of LoadOperation(Of Usuari))(AddressOf GetUsuariActual_Loaded), _
           False)
    End Sub

    Public Shared Sub Finalitzar()
        _UsuariActual = Nothing

        _IsHostalsLoaded = False
        _IsTipusDespesaIngresLoaded = False
        _IsUsuarisLoaded = False
        _IsCategoriesLoaded = False

        _IsHostalsLoading = False
        _IsTipusDespesaIngresLoading = False
        _IsUsuarisLoading = False
        _IsCategoriesLoading = False

        _DomainContext = Nothing

        GC.Collect()
    End Sub

    Public Shared Sub Refresh()
        'If _EstatCarregaActual >= MAX_ITEM_REFRESH_STEP Then
        '    ' refresca les dades de master, secundari, routers i valvules
        '    _EstatCarregaActual = MIN_ITEM_REFRESH_STEP
        '    LoadNext()
        'End If
    End Sub
#End Region

#Region "Propietats"
    Private Shared ReadOnly Property IsContexteInicialitzat() As Boolean
        Get
            Return _UsuariActual IsNot Nothing
        End Get
    End Property

    Public Shared ReadOnly Property UsuariActual() As Usuari
        Get
            Return _UsuariActual
        End Get
    End Property

    Public Shared ReadOnly Property HostalActual As Hostal
        Get
            If UsuariActual.IdTipusUsuari = EnumTipusUsuari.Administrador Or UsuariActual.IdTipusUsuari = EnumTipusUsuari.Manager Then
                Throw New ArgumentException(StringLibrary.TipusUsuariNoValid)
            Else
                Return HostalsPerUsuariActual.FirstOrDefault()
            End If
        End Get
    End Property

    Public Shared ReadOnly Property DomainContext() As LullabyDomainContext
        Get
            If _DomainContext Is Nothing Then
                _DomainContext = New LullabyDomainContext
            End If
            Return _DomainContext
        End Get
    End Property
#End Region

#Region "Carrega dades globals"
    Private Shared Sub GetUsuariActual_Loaded(ByVal llistaValors As LoadOperation(Of Usuari))
        'Controlem els errors
        If llistaValors.HasError Then
            _UsuariActual = Nothing
            RaiseEvent ContexteInicialitzat(False, llistaValors.Error.Message)
        Else
            _UsuariActual = llistaValors.Entities.FirstOrDefault()
        End If

        'Carreguem la resta de dades
        If _UsuariActual Is Nothing Then
            RaiseEvent ContexteInicialitzat(False, StringLibrary.NoUsuari)
        Else
            LoadNext()
            RaiseEvent ContexteInicialitzat(True, "")
        End If
    End Sub
#End Region

End Class
